package com.heima.user.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.common.exception.CustomException;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dto.LoginDto;
import com.heima.model.user.pojo.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserLoginService;
import com.heima.utils.common.AppJwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @author TheCai
 * @date 2021/6/3 23:15
 */
@Service
public class ApUserLoginServiceImpl implements ApUserLoginService {
  @Autowired ApUserMapper apUserMapper;

  /**
   * 登录 ,手机号或者设备id登录
   *
   * @param dto
   * @return
   */
  @Override
  public ResponseResult login(LoginDto dto) {
    // 1.检查参数,要么有设备id要么有手机号+密码
    Map map = new HashMap<>();
    if (dto.getEquipmentId() == null
        && (StrUtil.isEmpty(dto.getPhone()) || StrUtil.isEmpty(dto.getPassword()))) {
      throw new CustomException(AppHttpCodeEnum.PARAM_INVALID);
    }
    // 2.如果包含手机号和密码
    if (StrUtil.isNotEmpty(dto.getPhone()) && StrUtil.isNotEmpty(dto.getPassword())) {
      // 2.1使用手机号查询ap_user是否存在
      ApUser apUser =
          apUserMapper.selectOne(
              Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
      if (apUser == null) {
        throw new CustomException(AppHttpCodeEnum.PARAM_INVALID);
      }
      // 2.2存在对比密码是否正确
      //           dto.getPassword()+apUser.getSalt()
      // 要把dto的密码+apuser里的盐合起来再md5加密去比对apuser的密码
      String inPassword =
          DigestUtils.md5DigestAsHex((dto.getPassword() + apUser.getSalt()).getBytes());

      //            apUser.getPassword().equals(inPassword)

      if (!apUser.getPassword().equals(inPassword)) {
        throw new CustomException(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
      }
      // 2.3颁发token
      String token = AppJwtUtil.getToken(apUser.getId());
      // 返回token和数据给前端
      map.put("token", token);
      // 把敏感数据隐藏一下
      apUser.setSalt("");
      apUser.setPassword("");
      map.put("user", apUser);
      return ResponseResult.okResult(map);
    } else {
      // 3.else 代表使用设备Id 登录 ,直接颁发token ,userId直接用0即可
      String token = AppJwtUtil.getToken(0);
      map.put("token", token);
      return ResponseResult.okResult(map);
    }
  }
}
